﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;

namespace Controller2.Models.ViewModels
{
    [Authorize]
    public class ClientesViewModel
    {
        public int ID { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Nome { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Endereco { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string CEP { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Site { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Fone { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Email { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Twitter { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Complemento { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string DataCadastro { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Cidade { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Username { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string DataNascimento { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string DataAbertura { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Fax { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Celular { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string RG { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string CPF { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string CNPJ { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string InscricaoEstadual { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string EmailContato { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Contato { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public int? RamalContato { get; set; }
        [StringLength(50, ErrorMessage = "50")]
        public string Sexo { get; set; }

        public IEnumerable<ClientesViewModel> Listar(ControllerBDModelContainer db, string texto, int filtro)
        {
            IEnumerable<ClientesViewModel> cli;
            int codigo = 0;
            if (filtro == 1)
            {
                if (!Int32.TryParse(texto, out codigo))
                {
                    filtro = 0;
                    texto = "";
                }
            }
            if (string.IsNullOrWhiteSpace(texto) || texto.Equals("Digite sua pesquisa"))
            {
                filtro = 0;
                texto = "";
            }
            switch (filtro)
            {
                default:
                    cli = (from t in db.TipoPessoa
                           where t.Tipo.Equals("Cliente")
                           from p in t.Pessoa
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new ClientesViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 1:
                    cli = (from t in db.TipoPessoa
                           where t.Tipo.Equals("Cliente")
                           from p in t.Pessoa
                           where p.IdPessoa == codigo
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new ClientesViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 2:
                    cli = (from t in db.TipoPessoa
                           where t.Tipo.Equals("Cliente")
                           from p in t.Pessoa
                           where p.NomePessoa.Contains(texto)
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new ClientesViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 3:
                    cli = (from t in db.TipoPessoa
                           where t.Tipo.Equals("Cliente")
                           from p in t.Pessoa
                           where p.Email.Contains(texto)
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new ClientesViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
                case 4:
                    cli = (from t in db.TipoPessoa
                           where t.Tipo.Equals("Cliente")
                           from p in t.Pessoa
                           where p.Cidade.NomeCidade.Contains(texto)
                           select new
                           {
                               ID = p.IdPessoa,
                               Nome = p.NomePessoa,
                               Email = p.Email,
                               Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.NomeEstado,
                               Fone = p.Fone,
                               DataCadastro = p.DataCadastro
                           }).ToList().Select(s => new ClientesViewModel
                           {
                               ID = s.ID,
                               Nome = s.Nome,
                               Email = s.Email,
                               Cidade = s.Cidade,
                               Fone = s.Fone,
                               DataCadastro = s.DataCadastro.ToShortDateString()
                           });
                    break;
            }

			return cli.OrderBy(o => o.ID); ;
        }

        public ClientesViewModel GetClienteCompleto(ControllerBDModelContainer db, string username)
        {
            #region Consulta de todos os tipos de pessoa q sejam clientes
            var p = db.Pessoa.Single(pes => pes.UserName == username);
            var pf = (from pesf in db.Pessoa.OfType<Pessoa_PF>()
                      where pesf.IdPessoa == p.IdPessoa && pesf != null
                      select new
                      {
                          DataNascimento = pesf.DataNascimento,
                          Celular = pesf.Celular,
                          RG = pesf.RG,
                          CPF = pesf.CPF,
                          Sexo = pesf.Sexo
                      }).FirstOrDefault();
            var pj = (from pesj in db.Pessoa.OfType<Pessoa_PJ>()
                      where pesj.IdPessoa == p.IdPessoa && pesj != null
                      select new
                      {
                          Fax = pesj.Fax,
                          Contato = pesj.Contato,
                          EmailContato = pesj.EmailContato,
                          RamalContato = pesj.RamalContato,
                          DataAbertura = pesj.DataAbertura,
                          CNPJ = pesj.CNPJ,
                          InscricaoEstadual = pesj.InscricaoEstadual
                      }).FirstOrDefault();

            #endregion
            var cli = new ClientesViewModel();
            cli.ID = p.IdPessoa;
            cli.DataCadastro = p.DataCadastro.ToShortDateString();
            cli.Nome = p.NomePessoa;
            cli.Endereco = p.Endereco + (p.NumEnd == null ? "" : ", ") + p.NumEnd + " - " + p.Bairro;
            cli.CEP = p.CEP;
            cli.Complemento = p.Complemento;
            cli.Cidade = p.Cidade.NomeCidade + " - " + p.Cidade.Estado.Sigla;
            cli.Fone = p.Fone;
            cli.Email = p.Email;
            cli.Site = p.Site;
            cli.Twitter = p.Twitter;
            cli.Username = p.UserName;
            if (pf != null)
            {
                cli.DataNascimento = pf.DataNascimento == null ? "" : pf.DataNascimento.ToShortDateString();
                cli.Sexo = string.IsNullOrWhiteSpace(pf.Sexo) ? "" : pf.Sexo == "M" ? "Masculino" : "Feminino";
                cli.RG = string.IsNullOrWhiteSpace(pf.RG) ? "" : pf.RG;
                cli.CPF = string.IsNullOrWhiteSpace(pf.CPF) ? "" : pf.CPF;
                cli.CPF = string.IsNullOrWhiteSpace(pf.CPF) ? "" : pf.CPF;
                cli.Celular = string.IsNullOrWhiteSpace(pf.Celular) ? "" : pf.Celular;
            }
            if (pj != null)
            {
                cli.DataCadastro = pj.DataAbertura == null ? "" : Convert.ToDateTime(pj.DataAbertura).ToShortDateString();
                cli.Fax = string.IsNullOrWhiteSpace(pj.Fax) ? "" : pj.Fax;
                cli.CNPJ = string.IsNullOrWhiteSpace(pj.CNPJ) ? "" : pj.CNPJ;
                cli.InscricaoEstadual = string.IsNullOrWhiteSpace(pj.InscricaoEstadual) ? "" : pj.InscricaoEstadual;
                cli.Contato = string.IsNullOrWhiteSpace(pj.Contato) ? "" : pj.Contato;
                cli.RamalContato = pj.RamalContato;
                cli.EmailContato = string.IsNullOrWhiteSpace(pj.EmailContato) ? "" : pj.EmailContato;
            }
            return cli;
        }

        public IEnumerable<ClientesViewModel> Procura(ControllerBDModelContainer db, string texto)
        {
            IEnumerable<ClientesViewModel> cli;
            int codigo = 0;
            if (Int32.TryParse(texto, out codigo))
            {
                cli = (from t in db.TipoPessoa
                       where t.Tipo.Equals("Cliente")
                       from p in t.Pessoa
                       where p.IdPessoa == codigo
                       select new
                       {
                           ID = p.IdPessoa,
                           Nome = p.NomePessoa,
                       }).ToList().Select(s => new ClientesViewModel
                       {
                           ID = s.ID,
                           Nome = s.Nome
                       });
            }
            else
            {
                cli = (from t in db.TipoPessoa
                       where t.Tipo.Equals("Cliente")
                       from p in t.Pessoa
                       where p.NomePessoa.Contains(texto)
                       select new
                       {
                           ID = p.IdPessoa,
                           Nome = p.NomePessoa,
                       }).ToList().Select(s => new ClientesViewModel
                       {
                           ID = s.ID,
                           Nome = s.Nome
                       });
            }

			return cli.OrderBy(o => o.ID); ;
        }
    }
}